// p1160队列安排
// 使用STL的list实现双向链表
#include <iostream>
#include <list>
using namespace std;
using Iter = list<int>::iterator;

const int maxN = 1e5 + 10; // 最大人数

Iter pos[maxN]; // 存储每个人在链表中的迭代器位置
list<int> queList; // 队列链表
bool erased[maxN]; // 标记某人是否已被移除
int N; // 总人数

// 构建队列
void buildQueue()
{
  queList.push_front(1); // 第一个人入队
  pos[1] = queList.begin(); // 记录第一个人的位置

  // 依次插入后续的人
  for (int i = 2; i <= N; i++)
  {
      int k, p;
      scanf("%d%d", &k, &p); // 读取插入信息
      if (p == 0)
      {
          // 插入到k的左边
          pos[i] = queList.insert(pos[k], i);
      }
      else
      {
          // 插入到k的右边
          auto nextIter = next(pos[k]);
          pos[i] = queList.insert(nextIter, i);
      }
  }
  int M;
  scanf("%d", &M); // 读取要移除的人数
  for (int x, i = 1; i <= M; i++)
  {
      scanf("%d", &x); // 读取要移除的人编号
      if (!erased[x])
      {
          queList.erase(pos[x]); // 从链表中移除
      }
      erased[x] = true; // 标记为已移除
  }
}
//多做一步标记因为有重复删除的可能性

int main()
{
  scanf("%d", &N); // 读取总人数
  buildQueue(); // 构建队列
  bool first = true;
  // 输出队列中的所有人
  for (int x: queList)
  {
      if (!first)
          putchar(' ');
      first = false;
      printf("%d", x);
  }
  putchar('\n');
  return 0;
}

